﻿#include<iostream>
#include<vector>
#include<string>
using namespace std;
////使用继承的方式模拟实现一个栈
//namespace zjh
//{
//	template<class T>
//	class stack : public vector<T>
//	{
//	public:
//		void push(const T& x)
//		{
//			//vector<T>::push_back(x);
//			push_back(x);
//		}
//		void pop()
//		{
//			vector<T>::pop_back();
//		}
//		const T& top()
//		{
//			return vector<T>::back();
//		}
//		bool empty()
//		{
//			return vector<T>::empty();
//		}
//	};
//}
//
//int main()
//{
//	zjh::stack<int> s1;
//	s1.push(1);
//	s1.pop();
//}
//class person
//{
//public:
//protected:
//	string _name;
//};
//
//class student : public person 
//{
//private:
//	int id;
//	int age;
//};
//
//int main()
//{
//	student s;
//
//	person p1 = s;
//	// 派⽣类对象可以赋值给基类的指针/引⽤
//	person* p2 = &s;
//	person& p3 = s;
//
//	return 0;
//}

//
//class A
//{
//protected:
//	int num = 1;
//};
//
//class B : public A
//{
//public:
//	void print()
//	{
//		cout << num << endl;
//	}
//private:
//	int num = 2;
//};
//
//int main()
//{
//	B b;
//	b.print();
//	return 0;
//}


//class Base {
//public:
//    Base() 
//    {
//        cout << "Base默认构造" << endl; 
//    }
//    Base(int x) : m_base(x) 
//    {
//        cout << "Base带参构造" << endl; 
//    }
//
//    Base(const Base& other) : m_base(other.m_base)
//    {
//        cout << "Base拷贝构造" << endl;
//    }
//    Base& operator=(const Base& other) 
//    {
//        if (this != &other) 
//        {
//            m_base = other.m_base;
//            cout << "Base赋值操作" << endl;
//        }
//        return *this;
//    }
//    virtual ~Base() 
//    {
//        cout << "Base析构" << endl; 
//    }  // 声明为virtual支持多态
//
//protected:
//    int m_base = 0;
//};
//
//class Derived : public Base {
//public:
//    Derived() { cout << "Derived默认构造" << endl; }
//    Derived(int x, int y) : Base(x), m_derived(y) 
//    {
//        cout << "Derived带参构造" << endl;
//    }
//    Derived(const Derived& other)
//        : Base(other), m_derived(other.m_derived) {  // 显式调用基类拷贝构造
//        cout << "Derived拷贝构造" << endl;
//    }
//    Derived& operator=(const Derived& other) {
//        if (this != &other) {
//            Base::operator=(other);  // 显式调用基类赋值操作
//            m_derived = other.m_derived;
//            cout << "Derived赋值操作" << endl;
//        }
//        return *this;
//    }
//    ~Derived() { cout << "Derived析构" << endl; }
//
//private:
//    int m_derived = 0;
//};
//
//void testConstruction() {
//    cout << "----- 构造测试 -----" << endl;
//    Derived d1;          // 先调用Base默认构造，再Derived默认构造
//    Derived d2(1, 2);    // 先调用Base带参构造，再Derived带参构造
//    Derived d3 = d2;     // 调用拷贝构造（基类部分通过Base拷贝构造完成）
//}
//
//void testAssignment() {
//    cout << "\n----- 赋值测试 -----" << endl;
//    Derived d1;
//    Derived d2(3, 4);
//    d1 = d2;  // 调用赋值操作（需显式调用基类operator=）
//}
//
//int main() {
//    testConstruction();
//    testAssignment();
//    return 0;
//}
//
//class Student;
//class Person
//{
//	public :
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//class Student : public Person
//{
//	protected :
//	int _stuNum; // 学号
//};
//
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	cout << s._stuNum << endl;
//} 
//int main()
//{
//	Person p;
//}


class Person
{
public :
	string _name; // 姓名
};
class Student : virtual public Person
{
	protected :
	int _num; //学号
};
class Teacher : virtual public Person
{
	protected :
	int _id; // 职⼯编号
};
class Assistant : public Student, public Teacher
{		
protected :
	string _majorCourse; // 主修课程
};
int main()
{
	// 编译报错：error C2385: 对“_name”的访问不明确
	Assistant a;
	a._name = "peter";
	// 需要显⽰指定访问哪个基类的成员可以解决⼆义性问题，但是数据冗余问题⽆法解决
	a.Student::_name = "xxx";
	a.Teacher::_name = "yyy";
	return 0;
}
